package com.rickpan.repository;

import com.rickpan.entity.TeamMessage;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 团队消息数据访问层
 * 
 * @author 开发团队协调员
 * @since 2025-07-16
 */
@Repository
public interface TeamMessageRepository extends JpaRepository<TeamMessage, Long> {

    /**
     * 分页查询团队消息（按时间倒序）
     * 
     * @param teamId 团队ID
     * @param pageable 分页参数
     * @return 分页消息列表
     */
    @Query("SELECT tm FROM TeamMessage tm WHERE tm.teamId = :teamId ORDER BY tm.createdAt DESC")
    Page<TeamMessage> findByTeamIdOrderByCreatedAtDesc(@Param("teamId") Long teamId, Pageable pageable);

    /**
     * 查询团队最近的消息
     * 
     * @param teamId 团队ID
     * @param limit 限制数量
     * @return 最近消息列表
     */
    @Query("SELECT tm FROM TeamMessage tm WHERE tm.teamId = :teamId ORDER BY tm.createdAt DESC LIMIT :limit")
    List<TeamMessage> findRecentMessagesByTeamId(@Param("teamId") Long teamId, @Param("limit") int limit);

    /**
     * 查询指定时间之后的团队消息
     * 
     * @param teamId 团队ID
     * @param afterTime 时间点
     * @return 消息列表
     */
    @Query("SELECT tm FROM TeamMessage tm WHERE tm.teamId = :teamId AND tm.createdAt > :afterTime ORDER BY tm.createdAt ASC")
    List<TeamMessage> findByTeamIdAndCreatedAtAfter(@Param("teamId") Long teamId, @Param("afterTime") LocalDateTime afterTime);

    /**
     * 统计团队消息总数
     * 
     * @param teamId 团队ID
     * @return 消息总数
     */
    long countByTeamId(Long teamId);

    /**
     * 统计用户在团队中发送的消息数
     * 
     * @param teamId 团队ID
     * @param senderId 发送者ID
     * @return 消息数量
     */
    long countByTeamIdAndSenderId(Long teamId, Long senderId);

    /**
     * 查询指定类型的团队消息
     * 
     * @param teamId 团队ID
     * @param messageType 消息类型
     * @param pageable 分页参数
     * @return 分页消息列表
     */
    Page<TeamMessage> findByTeamIdAndMessageTypeOrderByCreatedAtDesc(Long teamId, TeamMessage.MessageType messageType, Pageable pageable);

    /**
     * 查询用户在团队中发送的消息
     * 
     * @param teamId 团队ID
     * @param senderId 发送者ID
     * @param pageable 分页参数
     * @return 分页消息列表
     */
    Page<TeamMessage> findByTeamIdAndSenderIdOrderByCreatedAtDesc(Long teamId, Long senderId, Pageable pageable);

    /**
     * 查询回复指定消息的所有消息
     * 
     * @param replyToId 被回复消息ID
     * @return 回复消息列表
     */
    List<TeamMessage> findByReplyToIdOrderByCreatedAtAsc(Long replyToId);

    /**
     * 删除团队的所有消息（团队删除时使用）
     * 
     * @param teamId 团队ID
     */
    void deleteByTeamId(Long teamId);

    /**
     * 查询失败的消息（用于重试机制）
     * 
     * @param teamId 团队ID
     * @return 失败消息列表
     */
    @Query("SELECT tm FROM TeamMessage tm WHERE tm.teamId = :teamId AND tm.messageStatus = 'failed' ORDER BY tm.createdAt DESC")
    List<TeamMessage> findFailedMessagesByTeamId(@Param("teamId") Long teamId);

    /**
     * 批量更新消息状态
     * 
     * @param messageIds 消息ID列表
     * @param status 新状态
     * @return 更新数量
     */
    @Query("UPDATE TeamMessage tm SET tm.messageStatus = :status WHERE tm.id IN :messageIds")
    int updateMessageStatus(@Param("messageIds") List<Long> messageIds, @Param("status") TeamMessage.MessageStatus status);

    /**
     * 查询团队中包含特定关键词的消息（搜索功能）
     * 
     * @param teamId 团队ID
     * @param keyword 关键词
     * @param pageable 分页参数
     * @return 分页消息列表
     */
    @Query("SELECT tm FROM TeamMessage tm WHERE tm.teamId = :teamId AND (tm.content LIKE %:keyword% OR tm.fileName LIKE %:keyword%) ORDER BY tm.createdAt DESC")
    Page<TeamMessage> searchMessagesByKeyword(@Param("teamId") Long teamId, @Param("keyword") String keyword, Pageable pageable);

    /**
     * 查询指定时间范围内的团队消息
     * 
     * @param teamId 团队ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param pageable 分页参数
     * @return 分页消息列表
     */
    @Query("SELECT tm FROM TeamMessage tm WHERE tm.teamId = :teamId AND tm.createdAt BETWEEN :startTime AND :endTime ORDER BY tm.createdAt DESC")
    Page<TeamMessage> findByTeamIdAndTimeRange(@Param("teamId") Long teamId, 
                                               @Param("startTime") LocalDateTime startTime, 
                                               @Param("endTime") LocalDateTime endTime, 
                                               Pageable pageable);

    /**
     * 统计团队中各类型消息的数量
     * 
     * @param teamId 团队ID
     * @return 统计结果 [messageType, count]
     */
    @Query("SELECT tm.messageType, COUNT(tm) FROM TeamMessage tm WHERE tm.teamId = :teamId GROUP BY tm.messageType")
    List<Object[]> countMessagesByType(@Param("teamId") Long teamId);
}
